package com.rzjm.api.entity.dto;

import com.rzjm.api.util.MathUtil;
import lombok.Data;

/**
 *  圆柱体 体积计算
 * @创建者：zhouwei
 * @创建时间：2023/2/10
 * @描述：
 */
@Data
public class Cylinder {
    /**
     *  半径
     */
    double rad;

    /**
     *  高度
     */
    double height;

    /**
     *  长半轴
     */
    double longHalf;

    /**
     *  短半轴
     */
    double shortHalf;

    /**
     * 是否是椭圆  0 - 正圆   1 - 椭圆
     */
    int isEllipse;

    /**
     *  立式  卧式 类型
     *  - 0 - 立式  1 - 卧式
     */
    int isLie;

    /**
     *  卧式 当前液位高度
     */
    double measureHeight;

    /**
     *  π
     */
//    final double PI = 3.1415926;
    //计算底面积
    public double area(){
        System.out.println("底面积 = " + Math.PI * rad * rad);
        if(isEllipse == 0){// 正圆
            return MathUtil.getDoubleUpThree(Math.PI * rad * rad);
        }else{// 椭圆
            //S=π×a×b
            //其中a、b分别是椭圆的长半轴，短半轴的长
            return MathUtil.getDoubleUpThree(Math.PI * longHalf * shortHalf);
        }
    }
    //计算体积
    public double volume(){
        if(isEllipse == 0) {// 正圆
            if(isLie == 0){
                return MathUtil.getDoubleUpThree((Math.PI * rad * rad) * height);
            }else{//卧式正圆
                return calculateCylVol(rad,height,measureHeight);
            }
        }else{//椭圆
            if(isLie == 0){
//            s=π(圆周率)×a×b(其中a,b分别是椭圆的长半轴,短半轴的长)
//            椭圆形圆柱体体积=s×h(h为圆柱体高度)
//            即椭圆形圆柱体体积=π×a×b×h
                return MathUtil.getDoubleUpThree(Math.PI * longHalf * shortHalf * height);
            }else{//卧式椭圆
                return calculateCylVolLie(longHalf,shortHalf,height,measureHeight);
            }
        }
    }

    /// <summary>
    /// 计算圆柱内
    /// 液体体积（圆柱体平躺）
    /// </summary>
    /// <param name="r">半径(m)</param>
    /// <param name="height">圆柱体高度(m)</param>
    /// <param name="lihe">液体高度(m)</param>
    /// <returns>体积（L）</returns>
    private double calculateCylVol(double r, double height, double lihe) {
        //底层面积
        double dm = 0;
        //三角形的底
        double sd = Math.abs(r - lihe);
        //圆心顶半角
        double cirdbj = Math.acos(sd / r);
        if (r > lihe) {
            //dm = Math.PI * r * r * (cirdbj * 2) / (2 * Math.PI) - r * Math.Sin(cirdbj) * sd;
            dm =  r * r * cirdbj - r * Math.sin(cirdbj) * sd;
        } else if (r < lihe) {
            //dm = Math.PI * r * r * (2 * Math.PI - cirdbj * 2) / (2 * Math.PI) + r * Math.Sin(cirdbj) * sd;
            dm =  r * r * (Math.PI - cirdbj) + r * Math.sin(cirdbj) * sd;
        } else {
            dm = Math.PI * r * r / 2;
        }
        //底面积*高
        return MathUtil.getDoubleUpThree(dm * height);
    }


    /// <summary>
    /// 计算圆柱内
    /// 液体体积（圆柱体平躺）
    /// </summary>
    /// <param name="r">半径(m)</param>
    /// <param name="height">圆柱体高度(m)</param>
    /// <param name="lihe">液体高度(m)</param>
    /// <returns>体积（L）</returns>
    private double calculateCylVolLie(double rLong, double rShort,double height, double lihe) {
        //底层面积
        double dm = 0;
        //三角形的底
        double sd = Math.abs(rShort - lihe);
        //圆心顶半角
        double cirdbj = Math.acos(sd / rShort);
        if (rShort > lihe) {
            //dm = Math.PI * r * r * (cirdbj * 2) / (2 * Math.PI) - r * Math.Sin(cirdbj) * sd;
            dm =  rLong * rShort * cirdbj - rShort * Math.sin(cirdbj) * sd;
        } else if (rShort < lihe) {
            //dm = Math.PI * r * r * (2 * Math.PI - cirdbj * 2) / (2 * Math.PI) + r * Math.Sin(cirdbj) * sd;
            dm =  rLong * rShort * (Math.PI - cirdbj) + rShort * Math.sin(cirdbj) * sd;
        } else {
            dm = Math.PI * rLong * rShort / 2;
        }
        //底面积*高
        return MathUtil.getDoubleUpThree(dm * height);
    }
}
